import axios from 'axios'
import type { AxiosResponse } from 'axios'
import zm from '@/utils/zm'

/**
 * 创建axios实例
 * 配置基础URL、超时时间及默认请求头
 */
const axiosHttp = axios.create({
  baseURL: 'http://localhost:5173',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
})

/**
 * 响应拦截器
 * 统一处理API响应，根据状态码进行相应操作
 */
axiosHttp.interceptors.response.use((response: AxiosResponse) => {
  const res = response.data;
  
  // 检查响应数据是否有效
  if (!zm.isNotNon(res)) {
    zm.error(`请求失效`)
    return Promise.reject(new Error('请求失效'))
  } 
  
  // 根据状态码处理不同情况
  if (res.code === "200" || res.code === 200) {
    // 请求成功
    return Promise.resolve(res)
  } else if (res.code === "403" || res.code === 403) {
    // 权限不足
    zm.error(`您暂无<${res.msg}>权限`)
    return Promise.reject(new Error(res.msg))
  } else if (res.code === '401' || res.code === 401) {
    // 未登录
    zm.openLogin()
    return Promise.reject(new Error('未登录'))
  } else {
    // 其他错误
    zm.error(`操作出现了问题：<${res.msg}>`)
    return Promise.reject(new Error(res.msg))
  }
}, error => {
  const { response } = error
  
  if (response) {
    // 有响应但出错，可根据状态码进一步处理
    switch (response.code) {
      case 404:
        // 可添加404处理逻辑
        break;
      // 可继续添加其他状态码处理
    }
  } else {
    // 网络错误或服务器无响应
    if (!window.navigator.onLine) {
      // 断网处理
      return Promise.reject(error)
    }
    return Promise.reject(error)
  }
  
  return Promise.reject(error)
})

export default axiosHttp